/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.edu.utn.frsf.ofa.javaee7.tp.ejemplo.ecompras.controller;

import ar.edu.utn.frsf.ofa.javaee7.tp.ejemplo.ecompras.modelo.DetalleOE;
import ar.edu.utn.frsf.ofa.javaee7.tp.ejemplo.ecompras.modelo.DetalleOP;
import ar.edu.utn.frsf.ofa.javaee7.tp.ejemplo.ecompras.modelo.Dimension;
import ar.edu.utn.frsf.ofa.javaee7.tp.ejemplo.ecompras.modelo.Insumo;
import ar.edu.utn.frsf.ofa.javaee7.tp.ejemplo.ecompras.modelo.Obra;
import ar.edu.utn.frsf.ofa.javaee7.tp.ejemplo.ecompras.modelo.OrdenProvision;
import ar.edu.utn.frsf.ofa.javaee7.tp.ejemplo.ecompras.util.BaseProduccion;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;

/**
 *
 * @author Administrador
 */
@Named("ordProvCtrl")
@SessionScoped
public class OrdenProvisionController implements Serializable {

    @Inject
    @BaseProduccion
    EntityManager em;

    @Inject
    transient Logger miLogger;
    
    private OrdenProvision ordenProvision;
    private DetalleOP ordenProvisionDetalle;

    private Integer obraSeleccionada;
    private Integer insumoSeleccionado;
    
    private List<OrdenProvision> listaOrdenProvision;

    @PostConstruct
    public void init(){
        this.listaOrdenProvision = this.buscarTodos();
    }
    /**
     * @return the ordenProvision
     */
    public OrdenProvision getOrdenProvision() {
        return ordenProvision;
    }

    /**
     * @param ordenProvision the ordenProvision to set
     */
    public void setOrdenProvision(OrdenProvision ordenProvision) {
        this.ordenProvision = ordenProvision;
    }

    /**
     * @return the listaOrdenProvision
     */
    public List<OrdenProvision> getListaOrdenProvision() {
        return listaOrdenProvision;
    }

    /**
     * @param listaOrdenProvision the listaOrdenProvision to set
     */
    public void setListaOrdenProvision(List<OrdenProvision> listaOrdenProvision) {
        this.listaOrdenProvision = listaOrdenProvision;
    }

    public String editar(){
        return "cargarOrdenProvision";
    }
    
    @Transactional
    private List<OrdenProvision> buscarTodos(){
        return em.createQuery("SELECT o FROM OrdenProvision o").getResultList();
    }

    private void insertarGuardar(){
        if(this.ordenProvision.getId()<=0 ) {
            em.persist(this.ordenProvision);
            em.flush();
            em.refresh(this.ordenProvision);
        }
        else {
            this.ordenProvision= em.merge(this.ordenProvision);
        }        
    }
    

    public String nuevo(){
        this.ordenProvision = new OrdenProvision();
        return "cargarOrdenProvision";
    }

   @Transactional
     public String guardar(){
        miLogger.log(Level.INFO," LOG DE GUARDAR ! ! ! ! "+this.ordenProvision.getObraEntrega());
        Obra obraSel = this.em.find(Obra.class, this.obraSeleccionada);
        this.ordenProvision.setObraEntrega(obraSel);
        this.insertarGuardar();
        this.listaOrdenProvision = this.buscarTodos();
        this.ordenProvisionDetalle = new DetalleOP();
        return "detalleOrdenProvision";
    }

   @Transactional
     public String borrar(){
        this.em.remove(this.ordenProvision);
        this.listaOrdenProvision = this.buscarTodos();
        this.ordenProvision = null;
        return null;
    }

    public String cancelar(){
        this.ordenProvision = null;
        return null;
    }

    public String nuevoDetalle(){
        this.ordenProvisionDetalle = new DetalleOP();
        return null;
    }

   @Transactional
     public String addDetalle(){         
// asigno insumo
         this.ordenProvisionDetalle.setInsumo(this.em.find(Insumo.class, this.insumoSeleccionado));
         //persisto el detalle
        this.em.persist(this.ordenProvisionDetalle);
        // lo vinculo con la orden de provision
        this.ordenProvision.getDetalle().add(this.ordenProvisionDetalle);
        // actualizo la oprden de provision
        this.ordenProvision = em.merge(this.ordenProvision);
        this.ordenProvisionDetalle = null;
        return null;
    }
     @Transactional
     public String quitarDetalle(){
       this.ordenProvision.getDetalle().remove(this.ordenProvisionDetalle);
       this.ordenProvision = em.merge(this.ordenProvision);
       em.remove(em.merge(this.ordenProvisionDetalle));
       this.ordenProvisionDetalle=null;
       return null;
    }

    public String cancelarDetalle(){
        return null;
    }
    /**
     * @return the obraSeleccionada
     */
    public Integer getObraSeleccionada() {
        return obraSeleccionada;
    }

    /**
     * @param obraSeleccionada the obraSeleccionada to set
     */
    public void setObraSeleccionada(Integer obraSeleccionada) {
        this.obraSeleccionada = obraSeleccionada;
    }

    /**
     * @return the ordenProvisionDetalle
     */
    public DetalleOP getOrdenProvisionDetalle() {
        return ordenProvisionDetalle;
    }

    /**
     * @param ordenProvisionDetalle the ordenProvisionDetalle to set
     */
    public void setOrdenProvisionDetalle(DetalleOP ordenProvisionDetalle) {
        this.ordenProvisionDetalle = ordenProvisionDetalle;
    }
    
    public Dimension[] getDimension() {
        return Dimension.values();
    }

    /**
     * @return the insumoSeleccionado
     */
    public Integer getInsumoSeleccionado() {
        return insumoSeleccionado;
    }

    /**
     * @param insumoSeleccionado the insumoSeleccionado to set
     */
    public void setInsumoSeleccionado(Integer insumoSeleccionado) {
        this.insumoSeleccionado = insumoSeleccionado;
    }
}
